package br.com.virtual.base.validator;

import java.util.InputMismatchException;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.inject.Inject;

import br.com.virtual.cadastrar.model.PessoaJuridica;
import br.com.virtual.cadastrar.service.PessoaJuridicaService;

/**
 * Por utilizar @Inject, deve possuir a annotation @ManagedBean ao inv�s de
 * 
 * @FacesValidator.
 */
@ManagedBean(name = "cnpjValidator")
@RequestScoped
public class CNPJValidator implements Validator {

	 @Inject private PessoaJuridicaService pessoaJuridicaService;

	@Override
	public void validate(FacesContext context, UIComponent component,
			Object valorTela) throws ValidatorException {

		if (!isCNPJ(String.valueOf(valorTela))) {
			throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "","CNPJ Inválido, verifique o número e tente novamente."));
		}

		PessoaJuridica pessoaJuridica = this.pessoaJuridicaService.findByCNPJ(valorTela.toString());

		// Verifica se o CNPJ já existe no banco de dados, se existe, retorna
		// erro
		 if (pessoaJuridica != null) {
			 Long idEditando = (Long) component.getAttributes().get("idPessoa");
			//
			 if (!pessoaJuridica.getId().equals(idEditando)) {
				 throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "",
							"O CNPJ digitado já foi cadastrado."));
			 }
		 }
	}

	private boolean isCNPJ(String CNPJ) {

		if (CNPJ.equals("00000000000000") || CNPJ.equals("11111111111111")
				|| CNPJ.equals("22222222222222")
				|| CNPJ.equals("33333333333333")
				|| CNPJ.equals("44444444444444")
				|| CNPJ.equals("55555555555555")
				|| CNPJ.equals("66666666666666")
				|| CNPJ.equals("77777777777777")
				|| CNPJ.equals("88888888888888")
				|| CNPJ.equals("99999999999999") || (CNPJ.length() != 14))
			return (false);

		char dig13, dig14;
		int sm, i, r, num, peso;

		try {
			// Calculo do 1o. Digito Verificador
			sm = 0;
			peso = 2;
			for (i = 11; i >= 0; i--) {
				// converte o i-ésimo caractere do CNPJ em um número:
				// por exemplo, transforma o caractere '0' no inteiro 0
				// (48 eh a posição de '0' na tabela ASCII)
				num = (int) (CNPJ.charAt(i) - 48);
				sm = sm + (num * peso);
				peso = peso + 1;
				if (peso == 10)
					peso = 2;
			}

			r = sm % 11;
			if ((r == 0) || (r == 1))
				dig13 = '0';
			else
				dig13 = (char) ((11 - r) + 48);

			// Calculo do 2o. Digito Verificador
			sm = 0;
			peso = 2;
			for (i = 12; i >= 0; i--) {
				num = (int) (CNPJ.charAt(i) - 48);
				sm = sm + (num * peso);
				peso = peso + 1;
				if (peso == 10)
					peso = 2;
			}

			r = sm % 11;
			if ((r == 0) || (r == 1))
				dig14 = '0';
			else
				dig14 = (char) ((11 - r) + 48);

			// Verifica se os dígitos calculados conferem com os dígitos
			// informados.
			if ((dig13 == CNPJ.charAt(12)) && (dig14 == CNPJ.charAt(13)))
				return (true);
			else
				return (false);
		} catch (InputMismatchException erro) {
			return (false);
		}
	}

}
